using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using DG.Tweening;


/// <summary>
/// 提示框的通用界面
/// </summary>
public class MessageBoxWnd : BaseUI//继承自BaseUI
{
    /// <summary>
    /// 弹出消息窗口的类型
    /// </summary>
    public enum Style
    {
        OK_CANCLE,
        OK,
        CANCLE,
        NONE
    };

    /// <summary>
    /// 弹出消息窗口的关闭类型
    /// </summary>
    public enum StyleExt
    {
        Toast,
        Alpha,
        Solid,
    };

    //Toast是一种非常方便的提示消息框，他会在程序界面上显示一个简单的提示信息，它具有两个特点。
    //1. Toast提示信息不会获得焦点，  
    //2. Toast提示信息过一段时间会自动消失

    static MessageBoxWnd instance;
    public static MessageBoxWnd Instance
    {
        get { return instance ?? (instance = new MessageBoxWnd()); }
    }

    private Text mContent;//显示提示的内容	
    private Text mTitle;//标题的内容
    private Text mContent1;

    private GameObject mBtnOK;//确认按钮
    private GameObject mBtnCancle;//取消按钮
    private GameObject mBtnQuit;
    private GameObject mGrayFilter;//灰色的背景
    private GameObject mBgRoot;
    private GameObject mbgRE;
    private static Style mWndStyle = Style.OK_CANCLE;//窗口的类型
    private static StyleExt mWndStyleExt = StyleExt.Solid;//窗口的关闭类型
    public static Style MsgBoxStyle { get { return mWndStyle; } set { mWndStyle = value; } }
    public static StyleExt MsgBoxStyleExt { get { return mWndStyleExt; } set { mWndStyleExt = value; } }

    public delegate void OnClickOK();//“确定”按钮的委托
    public delegate void OnClickCancle();//“取消”按钮的委托


    public static OnClickOK OnClickedOk;//声明“确定”按钮的委托，注册的例句：MessageBoxWnd.Instance.OnClickedOk = OnClickOkToRelogin;
    public OnClickCancle OnClickedCancle;//声明“取消”按钮的委托
    public string type = "";//是从哪来的，控制点击的时候的音效
    /// <summary>
    /// 必须重写(override)父类的GetUIType ()方法
    /// 返回该UI对象的类型EnumUIType
    /// </summary>
    /// <returns></returns>
    public override EnumUIType GetUIType()
    {
        return EnumUIType.MessageBoxWnd;
    }

    /// <summary>
    /// 打开窗口的复写的函数
    /// </summary>
    /// <returns></returns>
    void Start()
    {
        instance = this;
        mWndObject = this.gameObject;
        IntiForText();

        Show(Defines.mMessageBoxWndTitle, Defines.mMessageBoxWndContent, Defines.mMessageBoxWndStyle, Defines.mMessageBoxWndStyleExt, Defines.mMessageBoxWndArgs);

        Init();//初始化
    }

    private void Show(string title, string content, Style styl, StyleExt mStyleExt, params object[] Args)
    {
        MsgBoxStyle = styl;//为窗口的类型赋值
        MsgBoxStyleExt = mStyleExt;//为窗口的关闭类型赋值

        if (!string.IsNullOrEmpty(title)) mTitle.text = title;//标题

        string strContent;
        if (Args != null)
        {
            //字符串格式化
            strContent = string.Format(content, Args);
        }
        else
        {
            strContent = content;
        }
        if (!string.IsNullOrEmpty(content))
        {
            if (MsgBoxStyleExt == StyleExt.Alpha)
            {
                mContent1.text = strContent;
            }
            else
            {
                mContent.text = strContent;
            }
        }
    }

    /// <summary>
    /// 初始化
    /// </summary>
    private void Init()
    {
        mBtnOK = Control("IbtnSure");//确定按钮
        mBtnCancle = Control("IbtnCancle");//取消按钮
        mGrayFilter = Control("Alpha");//灰色的背景
        mBgRoot = Control("BgRoot");
        mbgRE = Control("bgRE");
        mBtnQuit = Control("IbtnQuit");
        mBtnOK.GetComponent<Button>().onClick.AddListener(OnClickIbtnSure);//确定按钮的点击事件   
        mBtnCancle.GetComponent<Button>().onClick.AddListener(OnClickIbtnCancle);//取消按钮的点击事件
        mBtnQuit.GetComponent<Button>().onClick.AddListener(OnClickIbtnCancle);
      //  mGrayFilter.GetComponent<Button>().onClick.AddListener(OnClickIbtnCancle);//点击背景  取消

        ComFuncAttForUI.SetButtonScale(mBtnCancle.gameObject);
        ComFuncAttForUI.SetButtonScale(mBtnOK.gameObject);
        ComFuncAttForUI.SetButtonScale(mBtnQuit.gameObject);

        SetWndStyle();// 根据窗口的类型，设置窗口
        SetWndStyleExt();//根据窗口的关闭类型，设置窗口的关闭
    }

    /// <summary>
    /// 在没打开之前初始化标题和内容
    /// </summary>
    private void IntiForText()
    {
        mTitle = Control("Title").GetComponent<Text>();//标题
        mContent = Control("Content").GetComponent<Text>();//提示的内容
        mContent1 = Control("Content1").GetComponent<Text>();
    }

    /// <summary>
    /// 根据窗口的类型，设置窗口
    /// </summary>
    private void SetWndStyle()
    {
        switch (mWndStyle)
        {
            case Style.NONE://当类型为NONE时，不显示按钮和背景，就是单独一行字时
                {
                    mbgRE.SetActive(true);
                    mContent1.gameObject.SetActive(true);
                }
                break;
            case Style.OK_CANCLE://默认状态，即预设的默认状态
                {
                    SetShowTe();
                    mBtnOK.gameObject.SetActive(true);
                    mBtnCancle.gameObject.SetActive(true);
                }
                break;
            case Style.OK://只有确认按钮时，不显示取消按钮，
                {
                    SetShowTe();
                    mBtnOK.gameObject.SetActive(true);
                    mBtnCancle.SetActive(false);//不显示取消按钮
                    Vector3 vSource = mBtnOK.transform.localPosition;//预设时“确认按钮”的初始位置
                    Vector3 vPos = new Vector3(0.0f, vSource.y, vSource.z);//居中处理 
                    mBtnOK.transform.localPosition = vPos;//居中
                }
                break;
            case Style.CANCLE:
                {
                    SetShowTe();
                    mBtnCancle.gameObject.SetActive(true);
                    mBtnOK.SetActive(false);//不显示确认按钮
                    Vector3 vSource = mBtnCancle.transform.localPosition;//预设时“取消按钮”的初始位置
                    Vector3 vPos = new Vector3(0.0f, vSource.y, vSource.z);//居中处理
                    mBtnCancle.transform.localPosition = vPos;//居中
                }
                break;
            default:
                break;
        }
    }

    private void SetShowTe()
    {
        mGrayFilter.gameObject.SetActive(true);
        mBgRoot.gameObject.SetActive(true);
        Control("Content").gameObject.SetActive(true);
        mBtnQuit.gameObject.SetActive(true);
        mbgRE.SetActive(false);
        mContent1.gameObject.SetActive(false);
        //Control("Title").gameObject.SetActive(true);
    }

    /// <summary>
    /// //不显示按钮和背景，设置提示内容的位置
    /// </summary>
    private void ChangeWndStyleExt()
    {
        //不显示按钮和背景
        mBtnCancle.SetActive(false);
        mBtnOK.SetActive(false);
        mGrayFilter.SetActive(false);
        mbgRE.SetActive(true);
        mBgRoot.SetActive(false);
        mBtnQuit.SetActive(false);
        mContent1.gameObject.SetActive(true);
        Control("Content").SetActive(false);
        //标题隐藏掉
        Control("Title").SetActive(false);
    }

    /// <summary>
    /// 根据窗口的关闭类型，设置窗口的关闭
    /// </summary>
    private void SetWndStyleExt()
    {
        switch (mWndStyleExt)
        {
            case StyleExt.Alpha://当为Alpha渐变消失时
                {
                    Invoke("SetAlpha", 2.0f);
                    Invoke("Close", 3.0f);
                }
                ChangeWndStyleExt();//不显示按钮和背景，设置提示内容的位置
                break;
            case StyleExt.Toast:
                {
                    if (null == this.gameObject.GetComponent<AutoClose>())
                    {
                        this.gameObject.AddComponent<AutoClose>();//为窗口添加一个AutoClose组件，自动关闭窗口的脚本
                    }
                }
                ChangeWndStyleExt();//不显示按钮和背景，设置提示内容的位置
                break;
            default:
                break;
        }
    }
    private void SetAlpha()
    {
        this.gameObject.transform.DOLocalMove(new Vector3(15.3f, 850f, 0), 1);
    }

    /// <summary>
    /// </summary>
    /// <param name="go"></param>
    private void OnClickIbtnCancle()
    {
        if (OnClickedCancle != null)//如果不为空
        {
            OnClickedCancle();//实现它
            OnClickedCancle = null;//设为空
        }
        Close();//关闭窗口
    }

    /// <summary>
    /// 确定按钮的点击事件
    /// </summary>
    /// <param name="go"></param>
    private void OnClickIbtnSure()
    {
        Close();//关闭窗口
        //if (AchievementUIWnd.ins!=null)
        //{
        //    AchievementUIWnd.ins.Close();
        //}
        //if (DailyTaskUIWnd.ins != null)
        //{
        //    DailyTaskUIWnd.ins.Close();
        //}
        if (OnClickedOk != null)//如果不为空
        {
            OnClickedOk();//实现它
            OnClickedOk = null;//设为空
        }
    }

    /// <summary>
    /// 关闭当前窗口
    /// </summary>
    private void Close()
    {
        Defines.mMessageBoxWndStyle = MessageBoxWnd.Style.OK_CANCLE;//消息模式
        Defines.mMessageBoxWndStyleExt = MessageBoxWnd.StyleExt.Solid;//离开模式
        Defines.mMessageBoxWndArgs = null;//消息的可变参数
        UIManager.Instance.CloseUI(EnumUIType.MessageBoxWnd);
    }
}